<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>watch-属性监听</title>
</head>
<body>
    <h2>watch-属性监听</h2>
    <ul>
        <li>用于监听某个属性的改变之后，做出一定的逻辑。在watch中定义方法，如果该方法监听的属性被改变，那么方法自动被调用。</li>
        <li>与computed相比，watch更侧重于数据改变之后做的逻辑，computed更侧重于根据数变化生成新的结果属性。</li>
    </ul>
    <h2>watch的常用用法</h2>
    <ul>
        <li>监听数据改变（通常监听id属性变化），然后根据变化之后的值，通过异步请求获取新数据。</li>
        <li>重要的数据改变，打印改变日志。</li>
    </ul>
    <h2>watch的高级设置</h2>
    <ul>
        <li>设置深度监听</li>
        <li>设置立刻监听</li>
    </ul>
    <main id="app">
        <div>米：<input type="number" v-model.trim.number="meters"></div>
        <div>千米：<input type="number" v-model.trim.number="kilometers"></div>
    </main>
</body>
<script src="../vue.js"></script>
<script>
    let vue = new Vue({
        el: "#app",
        data: {
            meters: 0,
            kilometers: 0
        },
        watch: {
            /**
             * newVal: 改变后的新值
             * oldVal：改变前的旧值
             * */
            kilometers(newVal,oldVal) {
                console.log("kilometers!newVal = ",newVal,",oldVal = ",oldVal);
                this.meters = 1000 * newVal;
            }
        }
    });

    // 方法二：也可以使用vue对象.$watch添加监听
    vue.$watch("meters",(newVal,oldVal) => {
        console.log("meters!newVal = ",newVal,",oldVal = ",oldVal);
        vue.kilometers = newVal / 1000;
    })
</script>
</html>